/**
 * CreateTime   : 2020年8月29日
 * Des          : UI栈式堆叠管理类
 *                UI对象会顺序入栈，只显示栈最顶层UI，栈顶以下的UI都会被隐藏，当弹出最顶层UI时，会重新显示栈顶最新的UI。
 */

import { EnUILayer } from "../const/EnCommon";
import { IFStack, IFMStack, FSMStack } from "../Utils";
import { UISystem } from "./UISystem";

// class UIControlStack extends IFStack
// {
//     public Name : string;
//     private args : any[];
//     private layer : EnUILayer;
//     private isCtr : boolean;
    
//     constructor(s : string, args : any[], isCtr : boolean)
//     {
//         super();
//         this.Name = s;
//         this.args = args;
//         this.isCtr = isCtr;
//     }

//     public enter(fsm : IFMStack)
//     {
//         UISystem.instance.Show(this.Name, this.args, this.isCtr);
//     }
//     public leave(fsm : IFMStack)
//     {
//         UISystem.instance.Destroy(this.Name)
//     }
//     public update(fsm : IFMStack){}
//     public enterFront(fsm : IFMStack)
//     {
//         UISystem.instance.Show(this.Name, this.args, this.isCtr)
//     }
//     public enterBack(fsm : IFMStack)
//     {
//         UISystem.instance.HidePanel(this.Name);
//     }
// }

export class UIControl
{
    private uiList = [];
    private uiNameMap : Map<string, boolean> = new Map<string, boolean>();

    Show(name : string, args : any[], isCtr?:boolean) : void
    {
        if (this.uiNameMap.has(name))
        {
            // 如果面板已经存在栈中，直接将界面上层的栈UI全部弹出。
            this.ShowByName(name);
        }
        else
        {
            // 新UI，直接压入栈中
            this.uiNameMap.set(name, true);
        }
    }

    Close(name? : string) : void
    {
        if (name)
        {
            if (!this.uiNameMap.has(name))
            {
                console.log("UIControlComponent Close can not find : " + name);
                return;
            }

            // 如果面板已经存在栈中，直接将界面上层的UI全部弹出。
            this.ShowByName(name);
            // 当前需要关闭的UI已经在栈顶，直接弹出关闭
            this.uiNameMap.delete(name);
        }
        else
        {
            this.uiNameMap.delete(name);
        }
    }

    CloseAll()
    {
        this.uiNameMap.clear();
    }

    IsHave(name : string)
    {
        return this.uiNameMap.get(name) ? true : false;
    }

    private ShowByName(name : string)
    {
        this.uiNameMap.delete(name);
    }
}